From b233f01b6a6011035821f68ab9153366be229308 Mon Sep 17 00:00:00 2001 From: Debian Qt/KDE Maintainers Date: Thu, 15 Aug 2019 15:15:39 +0100 Subject: [PATCH] revert_remove_our_use_of_syscall_for-statx Gbp-Pq: Name revert_remove_our_use_of_syscall_for-statx.patch --- src/corelib/global/minimum-linux_p.h | 7 +--- src/corelib/io/qfilesystemengine_unix.cpp | 45 +++++++++++++++++++++-- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/corelib/global/minimum-linux_p.h b/src/corelib/global/minimum-linux_p.h index 9c074e13b..bad2488b4 100644 --- a/src/corelib/global/minimum-linux_p.h +++ b/src/corelib/global/minimum-linux_p.h @@ -75,14 +75,9 @@ QT_BEGIN_NAMESPACE * - accept4 2.6.28 * - renameat2 3.16 QT_CONFIG(renameat2) * - getrandom 3.17 QT_CONFIG(getentropy) - * - statx 4.11 QT_CONFIG(statx) */ -#if QT_CONFIG(statx) -# define MINLINUX_MAJOR 4 -# define MINLINUX_MINOR 11 -# define MINLINUX_PATCH 0 -#elif QT_CONFIG(getentropy) +#if QT_CONFIG(getentropy) # define MINLINUX_MAJOR 3 # define MINLINUX_MINOR 17 # define MINLINUX_PATCH 0 diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp index 7a77f9823..7c731afca 100644 --- a/src/corelib/io/qfilesystemengine_unix.cpp +++ b/src/corelib/io/qfilesystemengine_unix.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2018 Intel Corporation. +** Copyright (C) 2017 Intel Corporation. ** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2013 Samuel Gaist ** Contact: https://www.qt.io/licensing/ @@ -88,6 +88,7 @@ extern "C" NSString *NSTemporaryDirectory(); #if defined(Q_OS_LINUX) # include +# include # include # include @@ -95,6 +96,28 @@ extern "C" NSString *NSTemporaryDirectory(); #ifndef FICLONE # define FICLONE _IOW(0x94, 9, int) #endif + +# if defined(Q_OS_ANDROID) +// renameat2() and statx() are disabled on Android because quite a few systems +// come with sandboxes that kill applications that make system calls outside a +// whitelist and several Android vendors can't be bothered to update the list. +# undef SYS_renameat2 +# undef SYS_statx +# undef STATX_BASIC_STATS +# else +# if !QT_CONFIG(renameat2) && defined(SYS_renameat2) +static int renameat2(int oldfd, const char *oldpath, int newfd, const char *newpath, unsigned flags) +{ return syscall(SYS_renameat2, oldfd, oldpath, newfd, newpath, flags); } +# endif + +# if !QT_CONFIG(statx) && defined(SYS_statx) +# include +static int statx(int dirfd, const char *pathname, int flag, unsigned mask, struct statx *statxbuf) +{ return syscall(SYS_statx, dirfd, pathname, flag, mask, statxbuf); } +# elif !QT_CONFIG(statx) && !defined(SYS_statx) +# undef STATX_BASIC_STATS +# endif +# endif // !Q_OS_ANDROID #endif #if defined(Q_OS_ANDROID) @@ -315,8 +338,22 @@ mtime(const T &statBuffer, int) #ifdef STATX_BASIC_STATS static int qt_real_statx(int fd, const char *pathname, int flags, struct statx *statxBuffer) { +#ifdef Q_ATOMIC_INT8_IS_SUPPORTED + static QBasicAtomicInteger statxTested = Q_BASIC_ATOMIC_INITIALIZER(0); +#else + static QBasicAtomicInt statxTested = Q_BASIC_ATOMIC_INITIALIZER(0); +#endif + + if (statxTested.load() == -1) + return -ENOSYS; + unsigned mask = STATX_BASIC_STATS | STATX_BTIME; int ret = statx(fd, pathname, flags, mask, statxBuffer); + if (ret == -1 && errno == ENOSYS) { + statxTested.store(-1); + return -ENOSYS; + } + statxTested.store(1); return ret == -1 ? -errno : 0; } @@ -1252,12 +1289,14 @@ bool QFileSystemEngine::renameFile(const QFileSystemEntry &source, const QFileSy if (Q_UNLIKELY(srcPath.isEmpty() || tgtPath.isEmpty())) return emptyFileEntryWarning(), false; -#if defined(RENAME_NOREPLACE) && QT_CONFIG(renameat2) +#if defined(RENAME_NOREPLACE) && (QT_CONFIG(renameat2) || defined(SYS_renameat2)) if (renameat2(AT_FDCWD, srcPath, AT_FDCWD, tgtPath, RENAME_NOREPLACE) == 0) return true; + // If we're using syscall(), check for ENOSYS; + // if renameat2 came from libc, we don't accept ENOSYS. // We can also get EINVAL for some non-local filesystems. - if (errno != EINVAL) { + if ((QT_CONFIG(renameat2) || errno != ENOSYS) && errno != EINVAL) { error = QSystemError(errno, QSystemError::StandardLibraryError); return false; } -- 2.30.2